package com.Exception异常.Throws异常抛出;

/**
 * 作    者 ：吾路巴尼
 * 创建时间 ：2025/2/19-16:28
 */
/** 1.编译异常必须处理，比如try-catch-finally 或 throws抛出；*/
/** 2.运行时异常可以不处理，也可以处理，不处理默认throws，就由JVM虚拟机处理；*/
/** 3.子类重写父类的方法时，抛出异常规定为：
 * 子类重写的方法抛出的异常类型跟父类抛出的异常一致或其子类
 * 简单理解为：跟访问权限一致，父类的protected子类不能扩大到public*/
/** 4.在throws过程中如果有方法try-catch处理了，就没必要throws了，二选一即可*/

/**细节1：编译异常必须处理，否则报错；这里f2抛出的异常被f1处理了*/
/**细节2：运行时异常并不要求显示处理，因为运行时异常有默认抛出的处理机制*/
import java.io.FileInputStream;
import java.io.FileNotFoundException;



public class ThrowsDetail01 {
    public static void main(String[] args) throws Exception{
            f1();//调用f1()方法，如果f1()方法抛出异常，这里也不做处理，则默认抛给JVM，由JVM虚拟机处理；

    }
    public static void  f1() throws ArithmeticException{
        /*** 1.编译异常必须处理，比如try-catch-finally 或 throws抛出；*/
         /** 2.运行时异常可以不处理，也可以处理，不处理默认throws，就由JVM虚拟机处理；*/
         int n = 10/0;//这里不做处理，默认抛给调用者；
         /***/
    }
}
/** 3.子类重写父类的方法时，抛出异常规定为：
 * 子类重写的方法抛出的异常类型跟父类抛出的异常一致或其子类
 * 简单理解为：跟访问权限一致，父类的protected子类不能扩大到public*/
class Father{
    public void method() throws RuntimeException {//运行时异常
    }
}
class Son extends Father{
    @Override
    public void method() throws NullPointerException{//空指针异常是运行时异常的子类，编译通过；
    }
}




class  A{
    /**细节1：编译异常必须处理，否则报错；这里f2抛出的异常被f1处理了*/
    public static void f1() {
        try {
            f2();//这里调用f2()方法，如果f2()方法抛出异常，这里不处理会报错；
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
    public  static void f2() throws FileNotFoundException {
        FileInputStream fis = new FileInputStream("d:\\a.txt"); //这里找不到文件的编译异常，抛出去了；
    }


    /**细节2：运行时异常并不要求显示处理，因为运行时异常有默认抛出的处理机制*/
    public static void f3() {  //这里调用f3()方法，如果f3()方法抛出运行时异常，不要求处理，Java有默认抛出的处理机制：默认 throws RuntimeException
        f4();
    }
    public static void f4() throws RuntimeException{  //抛出运行时异常，
    }
}